perm filename TC[D,SYS]1 blob sn#191504 filedate 1975-12-09 generic text, type T, neo UTF8
COMMENT ⊗   VALID 00010 PAGES 
RECORD PAGE   DESCRIPTION
 00001 00001
 00002 00002		TITLE	TC	TAPE CONVERT
 00003 00003		SUBTTL	DATA STORAGE
 00004 00004		SUBTTL	ERRORS
 00005 00005		SUBTTL	OUTPUT STUFF
 00007 00006		SUBTTL	BEGIN HERE
 00010 00007		SUBTTL	TL RQ COMMAND
 00012 00008		SUBTTL	READ THE TAPE, ETC.
 00013 00009		SUBTTL	PROCESS A FILE
 00017 00010		END	BEGIN
 00018 ENDMK
⊗;
	TITLE	TC	TAPE CONVERT
	SUBTTL	REG STANFORD AI.
;READ FAILSAFE TAPES AND WRITE DISK FILES
A←1
B←2
C←3
D←4
W←5
X←6
Y←7
Z←10
K←11
L←12
M←13
N←14
R←15
P←17


PDLEN←40
MTA←←1
LST←←2
DSK←←3


OPDEF	RESET	[CALLI]
OPDEF	EXIT	[CALLI	12]

	SUBTTL	DATA STORAGE
PDLIST:	BLOCK	PDLEN
TIBUF:	BLOCK	3
DOBUF:	BLOCK	3
LSTBUF:	BLOCK	3
LIST:	0		;SET TO -1 WHEN LISTING NAMES ONLY
QMODE:	0		;SET TO -1 TO ASK BEFORE EACH TRANSFER
WC:	0
WC1:	0
FILNAM:	BLOCK	4
DEVNAM:	0		;STRUCTURE NAME FROM TAPE
CRLF:	BYTE(7)15,12
	SUBTTL	ERRORS
NODISK:	OUTSTR	[ASCIZ/DISK INIT FAILURE
/]
	EXIT

NOFAIL:	OUTSTR	[ASCIZ/ASSIGN A TAPE LOGICAL NAME FAILSA AND START
/]
	EXIT

NOENT:	MOVEI	B,[ASCIZ/ENTER FAILED  /]
	PUSHJ	P,PUTSTR
	MOVEM	D,FILNAM+3
	MOVE	D,[A,,FILNAM]
	BLT	D,FILNAM+2
	PUSHJ	P,PUTFIL
	MOVEI	B,CRLF
	PUSHJ	P,PUTSTR
	OUTSTR	[ASCIZ/TYPE ANYTHING TO CONTINUE. /]
	TTCALL	11,0
	TTCALL	0,A
	MOVE	D,[FILNAM,,A]
	BLT	D,D
	POPJ	P,

INVHDR:	OUTSTR	[ASCIZ/HEADER RECORD IS INVALID.
/]
	EXIT

	SUBTTL	OUTPUT STUFF
PUTCHR:	SOSG	LSTBUF+2
	OUT	LST,
	JRST	PUTCH1
	OUTSTR	[ASCIZ/OUTPUT ERROR ON TAPLST.$$$
/]
	HALT	.+1

PUTCH1:	IDPB	A,LSTBUF+1
	TTCALL	1,A
	POPJ	P,

PUTSTR:	HRLI	B,440700
PUTST1:	ILDB	A,B
	JUMPE	A,CPOPJ
	PUSHJ	P,PUTCHR
	JRST	PUTST1

PUTDEC:	IDIVI	A,12
	HRLM	B,(P)
	JUMPE	A,.+2
	PUSHJ	P,PUTDEC
	HLRZ	A,(P)
	ADDI	A,"0"
	JRST	PUTCHR

PUTOCT:	IDIVI	A,10
	HRLM	B,(P)
	JUMPE	A,.+2
	PUSHJ	P,PUTOCT
	HLRZ	A,(P)
	ADDI	A,"0"
	JRST	PUTCHR


PUTSIX:	MOVE	B,A
PUTSX1:	SETZ	A,
	JUMPE	B,CPOPJ
	LSHC	A,6
	ADDI	A," "
	PUSHJ	P,PUTCHR
	JRST	PUTSX1

PUTFIL:	MOVE	A,FILNAM
	PUSHJ	P,PUTSIX
	HLLZ	B,FILNAM+1
	JUMPE	B,PUTFL1
	MOVEI	A,"."
	PUSHJ	P,PUTCHR
	MOVE	A,B
	PUSHJ	P,PUTSIX
PUTFL1:	SKIPN	FILNAM+3
	POPJ	P,
	MOVEI	A,"["
	PUSHJ	P,PUTCHR
	HLLZ	A,FILNAM+3
	PUSHJ	P,PUTSIX
	MOVEI	A,","
	PUSHJ	P,PUTCHR
	HRLZ	A,FILNAM+3
	PUSHJ	P,PUTSIX
	MOVEI	A,"]"
	JRST	PUTCHR

WRDOUT:	SOSG	DOBUF+2
	OUT	DSK,
	JRST	WRDOT1
	OUTSTR	[ASCIZ/DISK WRITE ERROR DURING RESTORE
/]
	HALT	.+1
WRDOT1:	IDPB	A,DOBUF+1
	POPJ	P,

	SUBTTL	BEGIN HERE
BEGIN:	RESET
	MOVE	P,[IOWD PDLEN,PDLIST]
	INIT	MTA,614		;800 BPI ODD
	'FAILSA'
	TIBUF
	JRST	NOFAIL
	UINBF	MTA,[2
		     1001]	;2 BUFFERS 1000 DATA WORDS EACH
	INIT	DSK,10		;GET A DSK CHANNEL
	'DSK   '
	DOBUF,,0
	JRST	NODISK
	INIT	LST,0		;GET A DSK CHANNEL
	'DSK   '
	LSTBUF,,0
	JRST	NODISK
	OUTSTR	[ASCIZ/RESTORE FAILSAFE TAPE TO DISK
/]
	JRST	CMD1
CMDH:	ASCIZ/COMMANDS ARE:
W	REWIND
L	LIST ALL FILE NAMES ON THE TAPE
	(ON TTY AND ON FILE TAPLST.$$$)
R	RESTORE ALL FILES.
Q	ASK ABOUT EACH FILE AND RESTORE IF REQUESTED.
H	TO GET THIS LIST
E	EXIT
/
CMD1:	OUTSTR	CMDH
CMDGET:	OUTSTR	[ASCIZ/*/]
CMDSKP:	TTCALL	4,A
	CAIE	A," "
	CAIN	A,15
	JRST	CMDSKP
	CAIN	A,12
	JRST	CMDGET
	CAIN	A,"E"
	CALLI	12
	CAIN	A,"H"
	JRST	[OUTSTR	CMDH
		JRST	CMDSKP]
	CAIN	A,175
	JRST	[OUTSTR	[ASCIZ/
/]
		JRST	CMDGET]
	CAIN	A,"W"
	JRST	[MTAPE	MTA,1
		MTAPE	MTA,0
		JRST	CMDSKP]
	CAIN	A,"L"
	JRST	[SETOM	LIST
		PUSHJ	P,TL
		JRST	CMDSKP]
	CAIN	A,"R"
	JRST	[SETZM	QMODE
		SETZM	LIST
		PUSHJ	P,RQ
		CLRBFI
		JRST	CMDGET]
	CAIN	A,"Q"
	JRST	[SETOM	QMODE
		SETZM	LIST
		TTCALL	11,0		;FLUSH TYPE AHEAD
		PUSHJ	P,RQ
		JRST	CMDSKP]
	OUTSTR	[ASCIZ/UNRECOGNIZED COMMAND "/]
	TTCALL	1,A
	OUTSTR	[ASCIZ/" FOR COMMAND LIST, TYPE H
/]
	TTCALL	11,0
	JRST	CMDGET
	SUBTTL	TL RQ COMMAND
RQ:
TL:	MOVE	A,['TAPLST']
	MOVSI	B,'$$0'
	SETZB	C,D
	ENTER	LST,A
	JRST	[PUSHJ P,NOENT
		POPJ	P,]
TLL:	PUSHJ	P,TAPIN		;GET FIRST WORD OF SOME FILE.
	JRST	TLEOT		;END OF TAPE ASSUMED
	HRRZM	A,WC		;SAVE THE WORD COUNT
;HERE THE CHOICES ARE
;	XWD V,4		V= FAILSAFE VERSION NUMBER
;	XWD -1,N	N= NUMBER OF DATA WORDS IN THIS RECORD
;			(FILE HEADER)
	JUMPL	A,FH	;PROCESS A FILE HEADER
;HERE WE MUST HAVE A TAPE HEADER
	PUSH	P,A
	MOVEI	B,[ASCIZ/FAILSAFE VERSION /]
	PUSHJ	P,PUTSTR
	POP	P,A
	HLRZ	A,A
	PUSHJ	P,PUTOCT
	PUSHJ	P,TAPINX	;READ MORE
	CAME	A,['*FAILS']
	JRST	INVHDR
	PUSHJ	P,TAPINX
	HLRZ	B,A
	CAIE	B,'AFE'
	JRST	INVHDR
	PUSH	P,A
	MOVEI	B,[ASCIZ/  TAPE NUMBER /]
	PUSHJ	P,PUTSTR
	POP	P,A
	HRRZ	A,A
	PUSHJ	P,PUTDEC
	MOVEI	B,CRLF
	PUSHJ	P,PUTSTR
	PUSHJ	P,TAPINX
	MOVNI	A,4
	ADDB	A,WC
	JUMPLE	A,TLEOF		;END OF FILE IF WC EXHAUSTED.
	PUSHJ	P,TAPINX
	SOSLE	WC
	JRST	.-2
TLEOF:	CLOSE	MTA,
	GETSTS	MTA,A
	TRZ	A,20000
	SETSTS	MTA,(A)
	JRST	TLL

TAPINX:	PUSHJ	P,TAPIN
	CAIA
	POPJ	P,
	POP	P,(P)
	JRST	TLEOF

TLEOT:	OUTSTR	[ASCIZ/LOGICAL END OF TAPE FOUND.
/]
	CLOSE	LST,
	POPJ	P,

	SUBTTL	READ THE TAPE, ETC.
TAPIN:	SOSLE	TIBUF+2		;COUNT THE BUFFER DOWN
	JRST	TAPIN1		;WE HAVE SOME ALREADY
	INPUT	MTA,
	STATO	MTA,762000	;TEST ERROR, EOF, PHEOT
	JRST	TAPIN1		;NO ERRORS
	STATZ	MTA,20000	;EOF
	POPJ	P,		;YES. RETURN QUICK
	STATZ	MTA,2000	;EOT
	JRST	TAPEOT

	OUTSTR	[ASCIZ/(MTA ERR)
/]
	HALT	.+1
	MOVSI	A,255000
	MOVEM	A,.-2
	GETSTS	MTA,A
	TRZ	A,740000
	SETSTS	MTA,(A)
TAPIN1:	ILDB	A,TIBUF+1
CPOPJ1:	AOS	(P)
CPOPJ:	POPJ	P,

TAPEOT:	OUTSTR	[ASCIZ/(PHYSICAL EOT)
/]
	JRST	TAPIN1

	SUBTTL	PROCESS A FILE
;HERE WHEN A FILE HEADER SEEN
FH:	PUSHJ	P,TAPINX	;GET THE STRUCTURE NAME
	MOVEM	A,DEVNAM	;SAVE DEVICE NAME
	PUSHJ	P,PUTSIX	;WRITE IT IN SIXBIT
	MOVEI	A,":"
	PUSHJ	P,PUTCHR
	PUSHJ	P,TAPINX	;READ 32.
	SUBI	A,4		;DECREASE BY NUMBER OF WORD WE READ BY HAND
	HRRZM	A,WC1		;SAVE SPECIAL WORD COUNT
	ADDI	A,6
	MOVN	A,A
	ADDM	A,WC		;SAVE WC
	PUSHJ	P,TAPINX	;GET THE PPN
	MOVEM	A,FILNAM+3	;SAVE IT
	PUSHJ	P,TAPINX	;GET THE FILE NAME
	MOVEM	A,FILNAM	;SAVE NAME
	PUSHJ	P,TAPINX
	MOVEM	A,FILNAM+1
	PUSHJ	P,TAPINX	;READ ANOTHER WORD.
	MOVEM	A,FILNAM+2	;SAVE CREATION DATE/TIME
	MOVE	B,WC1
	PUSHJ	P,TAPINX
	SOJG	B,.-1		;SKIP OVER THE LOOKUP INFORMATION
	PUSHJ	P,PUTFIL	;TYPE THE FILE DATA
	MOVEI	B,CRLF
	HLRZ	C,FILNAM+1	;CHECK THE EXTENSION
	CAIN	C,'UFD'
	MOVEI	B,[ASCIZ/	UFD FILES ARE NOT RESTORED.
/]
	PUSHJ	P,PUTSTR
	CAIE	C,'UFD'
	SKIPE	LIST		;ARE WE LISTING?
	JRST	FH2		;YES. FLUSH FILE DOWN THE DRAIN
	SKIPN	QMODE		;ARE WE ASKING ABOUT EACH TRANSFER?
	JRST	FH1		;NO WE DO THIS ONE
	OUTSTR	[ASCIZ/TYPE "Y" TO COPY THIS FILE: /]
	TTCALL	0,A		;GET HIS ANSWER
	TTCALL	11,
	OUTSTR	CRLF
	TRZ	A,40
	CAIN	A,"Y"
	JRST	FH1		;DO IT
	CAIE	A,"G"
	JRST	FH2		;DON'T DO IT
	SETZM	QMODE		;DON'T ASK AGAIN
FH1:	MOVEI	R,WRDOUT	;INITIALIZE R.
	MOVE	A,FILNAM
	MOVE	B,FILNAM+1
	MOVE	C,FILNAM+2
	TLZ	C,777000	;ENTER WITH 0 PROTECTION
	SETZ	D,
	ENTER	DSK,A
	PUSHJ	P,NOENT
	CAIA
FH2:	MOVEI	R,CPOPJ		;THE ADDRESS FOR WRITING.
FH3:	SOSGE	WC		;DECREMENT THE WORD COUNT
	JRST	FH4		;ALL DONE WITH WORD COUNT
	PUSHJ	P,TAPINX	;READ THE TAPE.
	PUSHJ	P,(R)		;WRITE
	JRST	FH3		;LOOP
FH4:	PUSHJ	P,TAPIN		;READ ONE MORE
	JRST	FH5		;END OF FILE IS A POSSIBILITY
FH4A:	HRRZM	A,WC		;SAVE WORD COUNT
	JUMPG	A,FH3		;JUMP IF WE ARE STILL IN THE FILE.
	SKIPN	LIST		;DONT CLOSE IF NOT OPEN
	CLOSE	DSK,
	JRST	FH		;PROCESS ANOTHER FILE.
FH5:	CLOSE	MTA,		;CLOSE WHEN YOU SEE EOF
	GETSTS	MTA,A
	TRZ	A,20000
	SETSTS	MTA,(A)
	PUSHJ	P,TAPIN
	JRST	TLEOF
	JRST	FH4A
	END	BEGIN